1、题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity。
2、wepon的解法
2.1 解析
复用 21.Merge Two Sorted Lists 这道题所写的函数mergeTwoLists()。
两种方法
-
一种是逐步地merge两个链表,形成新的链表,再将新的链表跟另一个链表merge,时间复杂度是O(n(n1+n2+n3....)) n是链表个数。【因为merge L1和L2花费O(L1+L2),形成新的链表的长度为n1+n2,merge该新链表与L3花费O((n1+n2)+n3).....所以总的是O((n1+n2)+((n1+n2)+n3)+.......)】
-
另外一种是用归并排序的思想,时间复杂度是O(logn(n1+n2+n3+......)),因为是两两merge,递归树有logn层,每一层的代价都为O(n1+n2+n3+......)。
2.2 代码
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
/*归并排序*/
int n=lists.size();
if(n==0) return nullptr;
if(n==1) return lists[0];
vector<ListNode *> list_left;
vector<ListNode *> list_right;
auto iter=lists.begin();
for(;iter<lists.begin()+n/2;iter++)
list_left.push_back(*iter);
for(;iter!=lists.end();iter++)
list_right.push_back(*iter);
ListNode *l1=mergeKLists(list_left);
ListNode *l2=mergeKLists(list_right);
return mergeTwoLists(l1,l2);
}
private:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode dummy(-1);
ListNode *head1=l1,*head2=l2,*tail=&dummy;
while(head1!=nullptr && head2!=nullptr)
{
if(head1->val<head2->val) {tail->next=head1;head1=head1->next;}
else {tail->next=head2;head2=head2->next;}
tail=tail->next;
}
if(head1==nullptr) tail->next=head2;
if(head2==nullptr) tail->next=head1; /*两句可以合并为 tail->next=head1==nullptr?head2:head1; */
return dummy.next;
}
};